# 设置跨域问题
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI, responses, HTTPException,status
from fastapi.exceptions import RequestValidationError
from common.response import responseCode


def register_cors(app: FastAPI):
    # 404捕获
    @app.exception_handler(404)
    async def custom_exception_handler(request, exc):
        return responses.JSONResponse({'code': status.HTTP_404_NOT_FOUND, 'message': '请检查请求路径', 'data': ''})

    @app.exception_handler(HTTPException)
    @app.exception_handler(RequestValidationError)
    async def custom_http_exception_handler(request, exc=None):

        if not hasattr(exc, 'detail'):
            msg = exc.errors()[0]['msg'] if exc.errors()[0]['msg'] else "校验失败"
            typeName = exc.errors()[0]['type'] if exc.errors()[0]['type'] else ""
            # 输入参数
            inputParams = exc.errors()[0]['input'] if exc.errors()[0]['input'] else {}
            back = {'code': responseCode.Error.value, 'message': msg, 'data': typeName}
        else:
            back = exc.detail
        return responses.JSONResponse(back)

    # 设置跨域问题
    app.add_middleware(
        CORSMiddleware,
        # 允许跨域的源列表，例如 ["http://www.example.org"] 等等，["*"] 表示允许任何源, 需要前端限制cookie
        allow_origins=["*"],
        # 跨域请求是否支持 cookie，默认是 False，如果为 True，allow_origins 必须为具体的源，不可以是 ["*"]
        # 前端请求应该支持cookie，所以这里是True, allow_origins应该是具体的源
        allow_credentials=True,
        # 允许跨域请求的 HTTP 方法列表，默认是 ["GET"]
        allow_methods=["*"],
        # 允许跨域请求的 HTTP 请求头列表，默认是 []，可以使用 ["*"] 表示允许所有的请求头
        # 如Accept、Accept-Language、Content-Language 以及 Content-Type 都允许
        allow_headers=["*"],
        # 可以被浏览器访问的响应头, 默认是 []，一般很少指定
        # expose_headers=["*"]
        # 设定浏览器缓存 CORS 响应的最长时间，单位是秒。默认为 600，一般也很少指定
        # max_age=1000
    )
